// 题目描述：
// 给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。

// 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。

 

// 示例 1：

// 输入：s = "IceCreAm"

// 输出："AceCreIm"

// 解释：

// s 中的元音是 ['I', 'e', 'e', 'A']。反转这些元音，s 变为 "AceCreIm".

// 示例 2：

// 输入：s = "leetcode"

// 输出："leotcede"

// 自己的答案：
/**
 * @param {string} s
 * @return {string}
 */
var reverseVowels = function (s) {
    let sArr = s.split('')
    // let yArr = sArr.filter((e, i) => ['a', 'e', 'i', 'o', 'u'].includes(e.toLowerCase())).reverse()
    let yArr = s.match(/[aeiouAEIOU]/g)?.reverse()
    sArr.forEach((e, i) => {
        if (['a', 'e', 'i', 'o', 'u'].includes(e.toLowerCase())) {
            sArr[i] = yArr.shift()
        }
    })
    return sArr.join('')

    // let result = ''
    // let yArr = s.match(/[aeiouAEIOU]/g)?.reverse()
    // for(let i = 0;i < s.length; i++) {
    //     if (['a', 'e', 'i', 'o', 'u'].includes(s[i].toLowerCase())) {
    //         result += yArr?.shift()
    //     } else {
    //         result += s[i]
    //     }
    // }
    // return result
};

// 官方答案：
var reverseVowels = function(s) {
    const n = s.length;
    const arr = Array.from(s);
    let i = 0, j = n - 1;
    while (i < j) {
        while (i < n && !isVowel(arr[i])) {
            ++i;
        }
        while (j > 0 && !isVowel(s[j])) {
            --j;
        }
        if (i < j) {
            swap(arr, i, j);
            ++i;
            --j;
        }
    }
    return arr.join('');
}

const isVowel = (ch) => {
    return "aeiouAEIOU".indexOf(ch) >= 0;
}

const swap = (arr, i, j) => {
    const temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}